home *** CD-ROM | disk | FTP | other *** search
- PROGRAM CrossRef;
-
- (*
- *============================================================================*
- * Credits: The Cross Reference portion of this program was taken from *
- * ALGORITHMS + DATA STRUCTURES = PROGRAMS which was written by *
- * Niklaus Wirth. Resource contructed using KRESOURCE by KUMA. *
- * *
- * The printer control codes are for EPSON or EPSON compatible *
- * printers. *
- * *
- * I'm sure much can be done to improve this code. Features *
- * that would be nice are 1) include the variable type *
- * 2) add switches for processing include files 3) generate *
- * separate cross reference tables for all PROCEDURES and *
- * FUNCTIONS 4) Read in a printer configuration file for printer *
- * independence 5) General clean up and documentation. *
- * *
- * Maybe someday I'll get a bug in me and work on it some more! *
- * *
- * Julian Garza *
- *============================================================================*
- *)
-
- LABEL 100;
-
- CONST
- zero = 0;
- one = 1;
- two = 2;
- three = 3;
- four = 4;
- c1 = 10;
- c2 = 8;
- c3 = 6;
- c4 = 9999;
- timeout= 5;
- {$I GEMCONST}
- {$I PAS_XREF.I}
-
- TYPE
- alfa = PACKED ARRAY[ 1..c1 ] OF CHAR;
- Str3 = STRING[ 3 ];
- NewWord = ARRAY[ 1..c1 ] OF CHAR;
- itemref = ^item;
- wordref = ^word;
- word = RECORD
- key : alfa;
- first,
- last : itemref;
- left,
- right : wordref;
- END;
- item = PACKED RECORD
- lno : zero..c4;
- next : itemref;
- END;
- Str12 = STRING[ 12 ];
- {$I GEMTYPE}
-
- VAR
- p_root : wordref;
- k,
- k1,
- lines,
- pages,
- drive,
- n : INTEGER;
- id : alfa;
- f : TEXT;
- a : NewWord;
- new_wrd : Str12;
- f_name,
- sf_name,
- f_path1,
- f_path2 : Path_Name;
- Intro_Box,
- Prt_Box : Dialog_Ptr;
- msg : Message_Buffer;
- flag : BOOLEAN;
- dummy,
- event : INTEGER;
-
- {$I GEMSUBS}
-
- FUNCTION CurDrive : INTEGER; GEMDOS( $19 );
-
- PROCEDURE IntToStr( n : INTEGER ; VAR n_str : Str3 );
- VAR i : INTEGER;
- BEGIN
- FOR i := zero TO two DO
- BEGIN
- n_str[ zero ] := Chr( three );
- n_str[ i + one ] := Chr(48+(n DIV Trunc(PwrOfTen(two-i))));
- n := n MOD Trunc( PwrOfTen( two - i ) );
- END;
- END; (* IntToStr *)
-
- PROCEDURE FindPath( full_name : Path_Name;
- VAR f_name : Path_Name;
- VAR path : Path_Name;
- VAR flag : BOOLEAN );
- CONST backslash = '\';
- VAR lastchar : INTEGER;
-
- FUNCTION Search( strname,target : Str255;
- srchdir : BOOLEAN ) : INTEGER;
- VAR lastchar : INTEGER;
- BEGIN
- IF ( Pos( target,strname ) = zero ) THEN Search := zero
- ELSE
- BEGIN
- IF srchdir THEN
- BEGIN
- lastchar := zero;
- REPEAT
- lastchar := lastchar + one;
- UNTIL strname[ lastchar ] = target;
- END
- ELSE
- BEGIN
- lastchar := Length( strname );
- REPEAT
- lastchar := lastchar - one;
- UNTIL strname[ lastchar ] = backslash;
- END;
- Search := lastchar - one;
- END;
- END; (* Search *)
-
- BEGIN
- flag := True;
- lastchar := Search( full_name,backslash,False );
- IF lastchar = zero THEN
- BEGIN
- lastchar := Search( full_name,backslash,False );
- flag := False;
- path := Copy( full_name,one,lastchar );
- END
- ELSE path := Copy( full_name,one,lastchar );
- f_name := Copy( full_name,lastchar+two,
- Length(full_name)-(lastchar+one) );
- END; (* FindPath *)
-
- FUNCTION ObjectSelected( event,objno : INTEGER ): BOOLEAN;
- VAR int_in : Int_In_Parms;
- int_out : Int_Out_Parms;
- addr_in : Addr_In_Parms;
- addr_out: Addr_Out_Parms;
- BEGIN
- IF ( event = E_Button ) THEN
- BEGIN
- AES_Call( 79,int_in,int_out,addr_in,addr_out );
-
- int_in[ zero ] := zero;
- int_in[ one ] := two;
- int_in[ two ] := int_out[ one ];
- int_in[ three ] := int_out[ two ];
- addr_in[ zero ]:= Prt_Box;
- int_in[ 8 ] := int_out[ four ];
- AES_Call( 43,int_in,int_out,addr_in,addr_out );
- IF int_out[ zero ] = objno THEN ObjectSelected := True
- ELSE ObjectSelected := False;
- END
- ELSE ObjectSelected := False
- END; (* ObjectSelected *)
-
- PROCEDURE DisplayDialog( start_obj : INTEGER; dialog : POINTER );
- VAR int_in : Int_In_Parms;
- int_out : Int_Out_Parms;
- addr_in : Addr_In_Parms;
- addr_out: Addr_Out_Parms;
- BEGIN
- Center_Dialog( dialog );
- addr_in[ zero ] := dialog;
- int_in[ zero ] := start_obj;
- int_in[ one ] := 10;
- int_in[ two ] := zero;
- int_in[ three ] := zero;
- int_in[ four ] := 639;
- int_in[ 5 ] := 199;
- AES_Call( 42,int_in,int_out,addr_in,addr_out );
- END; (* DisplayDialog *)
-
-
- FUNCTION Reserved( word : Str12 ) : BOOLEAN;
- VAR
- r_words : ARRAY[ 1..51 ] OF Str12;
- i : INTEGER;
- BEGIN
- r_words[ 1 ] := 'AND'; r_words[ 2 ] := 'ARRAY';
- r_words[ 3 ] := 'BEGIN'; r_words[ 4 ] := 'BIOS';
- r_words[ 5 ] := 'C'; r_words[ 6 ] := 'CASE';
- r_words[ 7 ] := 'CONST'; r_words[ 8 ] := 'DIV';
- r_words[ 9 ] := 'DO'; r_words[ 10] := 'DOWNTO';
- r_words[ 11] := 'ELSE'; r_words[ 12] := 'END';
- r_words[ 13] := 'EXIT'; r_words[ 15] := 'EXTERNAL';
- r_words[ 16] := 'FILE'; r_words[ 17] := 'FOR';
- r_words[ 18] := 'FORWARD'; r_words[ 19] := 'FUNCTION';
- r_words[ 20] := 'GEMDOS'; r_words[ 21] := 'GOTO';
- r_words[ 22] := 'IF'; r_words[ 23] := 'IN';
- r_words[ 24] := 'LABEL'; r_words[ 25] := 'LOOP';
- r_words[ 26] := 'MOD'; r_words[ 27] := 'NOT';
- r_words[ 28] := 'OF'; r_words[ 29] := 'OR';
- r_words[ 30] := 'OTHERWISE'; r_words[ 31] := 'PACKED';
- r_words[ 32] := 'PROCEDURE'; r_words[ 33] := 'PROGRAM';
- r_words[ 34] := 'RECORD'; r_words[ 35] := 'REPEAT';
- r_words[ 36] := 'SET'; r_words[ 37] := 'THEN';
- r_words[ 38] := 'TO'; r_words[ 39] := 'TYPE';
- r_words[ 40] := 'UNTIL'; r_words[ 41] := 'WHILE';
- r_words[ 42] := 'WITH'; r_words[ 43] := 'XBIOS';
- r_words[ 44] := 'BYTE'; r_words[ 45] := 'CHAR';
- r_words[ 46] := 'INTEGER'; r_words[ 47] := 'LONG_INTEGER';
- r_words[ 48] := 'REAL'; r_words[ 49] := 'STRING';
- r_words[ 50] := 'VAR';
- i := zero;
- REPEAT
- i := Succ( i );
- UNTIL (( i > 50 ) OR ( r_words[ i ] = word ));
- IF ( i < 51 ) THEN Reserved := TRUE
- ELSE Reserved := FALSE;
- END; (* Reserved *)
-
- PROCEDURE P_Eject;
- VAR n : Str3;
- BEGIN
- pages := Succ( pages );
- IntToStr( pages,n );
- Set_DText( Prt_Box,page,n,System_Font,TE_Right );
- DisplayDialog( page,Prt_Box );
- WRITE( Chr( 12 ) );
- WRITELN; WRITELN;
- WRITELN( 'File: ',f_name );
- WRITELN( 'Page: ',pages:5 );
- WRITELN;
- lines := 5;
- END; (* Page *)
-
- PROCEDURE Search( VAR w1 : wordref );
- VAR
- w : wordref;
- x : itemref;
- BEGIN
- w := w1;
- IF ( w = Nil ) THEN
- BEGIN
- New( w );
- New( x );
- WITH w^ DO
- BEGIN
- key := id;
- left := Nil;
- right := Nil;
- first := x;
- last := x;
- END;
- x^.lno := n;
- x^.next := Nil;
- w1 := w;
- END
- ELSE
- IF ( id < w^.key ) THEN Search( w^.left )
- ELSE
- IF ( id > w^.key ) THEN Search( w^.right )
- ELSE
- BEGIN
- New( x );
- x^.lno := n;
- x^.next := Nil;
- w^.last^.next := x;
- w^.last := x;
- END;
- END; (* Search *)
-
- PROCEDURE PrintTree( w : wordref );
-
- PROCEDURE PrintWord( w : word );
- VAR
- l : INTEGER;
- x : itemref;
- BEGIN
- WRITE( ' ',w.key );
- x := w.first;
- l := zero;
- REPEAT
- IF ( l = c2 ) THEN
- BEGIN
- WRITELN;
- lines := Succ( lines );
- IF ( lines > 60 ) THEN P_Eject;
- l := zero;
- WRITE( ' ':c1+1 );
- END;
- l := Succ( l );
- WRITE( x^.lno:c3 );
- x := x^.next;
- UNTIL ( x = Nil );
- WRITELN;
- lines := Succ( lines );
- IF ( lines > 60 ) THEN P_Eject;
- END; (* PrintWord *)
-
- BEGIN
- IF ( w <> Nil ) THEN
- BEGIN
- PrintTree( w^.left );
- PrintWord( w^ );
- PrintTree( w^.right );
- END;
- END; (* PrintTable *)
-
- PROCEDURE Initialize;
- BEGIN
- Set_Mouse( M_Arrow );
- Paint_Style( Solid );
- Paint_Color( Green );
- Clear_Screen;
- Paint_Rect( zero,zero,639,200 );
- Find_Dialog( hello,Intro_Box );
- Find_Dialog( printing,Prt_Box );
- Center_Dialog( Intro_Box );
- n := Do_Dialog( Intro_Box,zero );
- End_Dialog( Intro_Box );
- Paint_Rect( zero,zero,639,200 );
- p_root := Nil;
- n := zero;
- k1 := c1;
- flag := False;
- drive := CurDrive;
- REWRITE( output,'LST:' );
- END; (* Initialize *)
-
- PROCEDURE Process_File;
- LABEL 100;
- VAR c : STRING[ one ];
-
- PROCEDURE BuildWord;
- VAR
- k : INTEGER;
- BEGIN
- k := zero;
- REPEAT
- IF ( k < c1 ) THEN
- BEGIN
- k := Succ( k );
- new_wrd[ zero ] := Chr( k );
- new_wrd[ k ] := f^;
- a[ k ] := f^;
- END;
- WRITE( f^ );
- GET( f );
- UNTIL ( NOT ( f^ IN [ 'A'..'Z','a'..'z','0'..'9','_' ] ) );
- IF ( k >= k1 ) THEN k1 := k
- ELSE
- REPEAT
- a[ k1 ] := ' ';
- k1 := Pred( k1 );
- UNTIL ( k1 = k );
- PACK( a,1,id );
- END; (* BuildWord *)
-
- BEGIN
- RESET( f,f_name );
- WRITE( Chr( 27 ),'M' );
- pages := zero;
- n := zero;
- P_Eject;
- WHILE ( NOT Eof( f ) ) DO
- BEGIN
- IF ( n = c4 ) THEN n := zero;
- n := Succ( n );
- WRITE( n:c3 );
- WRITE( ' ' );
- WHILE( NOT Eoln( f ) ) DO
- BEGIN
- IF ( f^ IN [ 'A'..'Z','a'..'z' ] ) THEN
- BEGIN
- BuildWord;
- IF ( NOT ( Reserved( new_wrd ) ) ) THEN Search( p_root );
- END
- ELSE
- BEGIN
- IF ( f^ = '''' ) THEN
- REPEAT
- WRITE( f^ );
- GET( f );
- UNTIL( f^ = '''' )
- ELSE
- IF ( f^ = '{' ) THEN
- REPEAT
- WRITE( f^ );
- GET( f );
- UNTIL ( f^ = '}' )
- ELSE
- BEGIN
- IF ( ( f^ = '*' ) AND ( c = '(' ) ) THEN
- REPEAT
- IF ( Eoln( f ) ) THEN WRITELN( f^ )
- ELSE WRITE( f^ );
- c := f^;
- GET( f );
- UNTIL( ( c = '*' ) AND ( f^ = ')' ) );
- END;
- WRITE( f^ );
- c := f^;
- GET( f );
- END;
- END;
- WRITELN( f^ );
- event := Get_Event( E_Button|E_Timer,
- one,one,one,
- timeout,
- False,zero,zero,zero,zero,
- False,zero,zero,zero,zero,msg,dummy,
- dummy,dummy,dummy,dummy,dummy );
- IF ( ObjectSelected( event,abort ) ) THEN
- BEGIN
- Obj_SetState( Prt_Box,print,Normal,True );
- Obj_SetState( Prt_Box,abort,Selected,True );
- GOTO 100;
- END;
- lines := Succ( lines );
- IF ( lines > 60 ) THEN P_Eject;
- GET( f );
- END;
- P_Eject;
- Set_DText( Prt_Box,what,'Xref ',System_Font,TE_Left );
- DisplayDialog( what,Prt_Box );
- PrintTree( p_root );
- 100: WRITELN;
- END; (* Process_File *)
-
- BEGIN
- IF ( Init_Gem >= zero ) THEN
- BEGIN
- IF ( Load_Resource( 'PAS_XREF.RSC' ) ) THEN
- BEGIN
- Initialize;
- f_path1 := 'A:\*.PAS';
- f_path1[ 1 ] := Chr( drive + 65 );
- WHILE ( Get_In_File( f_path1,f_name ) ) DO
- BEGIN
- Paint_Rect( zero,zero,639,200 );
- flag := False;
- FindPath( f_name,sf_name,f_path2,flag );
- f_path1 := Concat( f_path2,'\*.PAS' );
- Set_DText( Prt_Box,what,'',System_Font,TE_Left );
- Set_DText( Prt_Box,dir,f_path2,System_Font,TE_Left );
- Set_DText( Prt_Box,fname,sf_name,System_Font,TE_Left );
- DisplayDialog( zero,Prt_Box );
- REPEAT
- event := Get_Event( E_Button|E_Timer,
- one,one,one,
- timeout,
- False,zero,zero,zero,zero,
- False,zero,zero,zero,zero,msg,dummy,
- dummy,dummy,dummy,dummy,dummy );
- IF ( ObjectSelected( event,abort ) ) THEN
- BEGIN
- Obj_SetState( Prt_Box,abort,Selected,True );
- GOTO 100;
- END;
- UNTIL( ObjectSelected( event,print ) );
- Obj_SetState( Prt_Box,print,Selected,True );
- Set_DText( Prt_Box,what,'Source',System_Font,TE_Left );
- DisplayDialog( what,Prt_Box );
- Process_File;
- Obj_SetState( Prt_Box,print,Normal,True );
- 100: End_Dialog( Prt_Box );
- Obj_SetState( Prt_Box,abort,Normal,False );
- f_path2 := f_path1;
- END;
- WRITE( Chr( 27 ),'P' );
- REWRITE( output,'CON:' );
- Free_Resource;
- END
- ELSE n := Do_Alert( '[1][Resource File not Found][ OK ]',0 );
- Exit_Gem;
- END;
- END. (* CrossRef *)
-